package servidor;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


//com usuario root e senha admin, criar o banco de dados com nome jogador_ranking
//O modo de acesso utilizado foi o jdbc
//para isso, foi preciso adicionar a biblioteca do driver jdbc (ver bibliotecas)
public class IP_Ranking {
    static{
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public HashMap<String, Integer> atualizarObterRanking() {
        HashMap<String, Integer> nomeNumeroDeVitoriasTable = new HashMap<String, Integer>();
        atualizaBancoDeDados();
        
        List<RN_Ranking> listaAtualizada = getJogadoresVencedores();
        for (RN_Ranking jogadorRanking : listaAtualizada) {
            nomeNumeroDeVitoriasTable.put(jogadorRanking.getNome(),jogadorRanking.getNumeroDeVitorias());
        }
        return nomeNumeroDeVitoriasTable;
    }

    public List<RN_Ranking> getJogadoresVencedores(){
        List<RN_Ranking> jogadores = new ArrayList<RN_Ranking>();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try{
            connection = getConnection();
            statement = connection.prepareStatement("SELECT * FROM jogador_ranking j");
            resultSet = statement.executeQuery();

            while(resultSet.next()){
                RN_Ranking jogadorRanking = new RN_Ranking();
                jogadorRanking.seNumeroDeVitorias(resultSet.getInt("vitorias"));
                jogadorRanking.setNome(resultSet.getString("nome"));                
                jogadores.add(jogadorRanking);
            }
            System.out.println(resultSet);
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
               connection.close();
            } catch (SQLException ex) {
               ex.printStackTrace();
            }
        }   

        return jogadores;
    }

    public void insertJogadorVencedor(RN_Ranking jogadorRanking){
        Connection connection = null;
        PreparedStatement statement = null;

        try{
            connection = getConnection();
            statement = connection.prepareStatement("INSERT INTO jogador_ranking "+
                    " (nome, vitorias)"+
                    " VALUES (?, ?)");

            statement.setString(1, jogadorRanking.getNome());
            statement.setInt(2, jogadorRanking.getNumeroDeVitorias());

            statement.executeUpdate();

        }catch(SQLException exception){
            exception.printStackTrace();
        }finally{
            try {
               connection.close();
            } catch (SQLException sqlException) {
               sqlException.printStackTrace();
            }                     
        }
    }
    
    public void updateJogadorVencedor(RN_Ranking jogadorRanking){
        Connection connection = null;
        PreparedStatement statement = null;

        try{
            connection = getConnection();
            statement = connection.prepareStatement("UPDATE jogador_ranking "+
                    " SET vitorias = ?"+
                    " WHERE nome = ?");
            
            statement.setInt(1, jogadorRanking.getNumeroDeVitorias()+1);
            statement.setString(2, jogadorRanking.getNome());            

            statement.executeUpdate();

        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
               connection.close();
            } catch (SQLException ex) {
               ex.printStackTrace();
            }
        }
    }

    private void atualizaBancoDeDados() {
        List<RN_Ranking> jogadores = new ArrayList<RN_Ranking>();
        jogadores = getJogadoresVencedores();
        //identificar o jogador vencedor
        //Obte-lo atraves da Mesa, que eh obtida pela partida
        String jogadorVencedor = RN_Partida.getRN_Partida().getMesa().getJogadorDaVez();
        //inserir esse jogador vencedor no banco de dados
        String nome = jogadorVencedor;
        boolean jogadorNaoEstaNoBanco = true;
        for (RN_Ranking jogadorRanking : jogadores) {
            if (nome.equals(jogadorRanking.getNome())) {
                updateJogadorVencedor(jogadorRanking);
                jogadorNaoEstaNoBanco = false;
                break;
            }
        }
        if (jogadorNaoEstaNoBanco) {
            insertJogadorVencedor(new RN_Ranking(jogadorVencedor, 1));
        }
    }

    private Connection getConnection() throws SQLException {
        //Nome do schema: presidente_bd
        //Nome da tabela: jogador_ranking
        return DriverManager.getConnection("jdbc:mysql://localhost/presidente_bd", 
                                   "root","admin");
    }
}
